Перейти к основному содержимому

3.08. Справочник по MySQL

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Справочник по MySQL

1. Архитектурные элементы

1.1. Основные компоненты MySQL

  • mysqld — основной серверный процесс, управляющий базами данных, соединениями, транзакциями и выполнением запросов.
  • mysql — клиентская программа командной строки для взаимодействия с сервером.
  • mysqladmin — утилита администрирования (остановка, перезагрузка, проверка состояния).
  • mysqldump — инструмент логического резервного копирования.
  • mysqlcheck — утилита проверки и восстановления таблиц.
  • mysql_upgrade — скрипт обновления системных таблиц после обновления версии сервера.
  • mysql_config_editor — средство безопасного хранения учетных данных в файле .mylogin.cnf.

1.2. Структура хранения

  • Data Dictionary — централизованный словарь метаданных, начиная с MySQL 8.0, реализованный как InnoDB-таблицы в схеме mysql.
  • System Tablespace — файл ibdata1, содержащий системные таблицы, откатные сегменты и данные общих таблиц.
  • Undo Tablespaces — отдельные файлы для хранения undo-логов (настраивается через innodb_undo_directory).
  • Redo Log — журнал предзаписи (ib_logfile0, ib_logfile1), используется для восстановления после сбоя.
  • Binary Log — журнал всех изменений данных и структур, необходимый для репликации и PITR (Point-in-Time Recovery).
  • General Query Log — лог всех подключений и запросов (включается через general_log).
  • Slow Query Log — лог медленных запросов (включается через slow_query_log).
  • Error Log — основной лог ошибок сервера.

2. Типы данных

2.1. Числовые типы

  • Целочисленные:
    • TINYINT — 1 байт, диапазон от -128 до 127 (или 0–255 беззнаковый).
    • SMALLINT — 2 байта, диапазон от -32768 до 32767.
    • MEDIUMINT — 3 байта, диапазон от -8388608 до 8388607.
    • INT или INTEGER — 4 байта, диапазон от -2147483648 до 2147483647.
    • BIGINT — 8 байт, диапазон от -9223372036854775808 до 9223372036854775807.
  • С плавающей точкой:
    • FLOAT(M,D) — одинарная точность, 4 байта.
    • DOUBLE(M,D) — двойная точность, 8 байт.
    • REAL — синоним DOUBLE при включённом REAL_AS_FLOAT.
  • Фиксированная точность:
    • DECIMAL(M,D) или NUMERIC(M,D) — хранимое значение с точным количеством цифр, до 65 цифр в целой части.

2.2. Строковые типы

  • Фиксированной длины:
    • CHAR(M) — строка фиксированной длины до 255 символов.
  • Переменной длины:
    • VARCHAR(M) — строка переменной длины до 65535 байт.
  • Большие объекты:
    • TINYTEXT — до 255 байт.
    • TEXT — до 65535 байт.
    • MEDIUMTEXT — до 16 МБ.
    • LONGTEXT — до 4 ГБ.
  • Бинарные:
    • BINARY(M) — бинарная строка фиксированной длины.
    • VARBINARY(M) — бинарная строка переменной длины.
    • TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB — бинарные аналоги TEXT-типов.

2.3. Типы даты и времени

  • DATE — дата в формате YYYY-MM-DD, диапазон от '1000-01-01' до '9999-12-31'.
  • TIME — время в формате HH:MM:SS[.fraction], диапазон от '-838:59:59' до '838:59:59'.
  • DATETIME — дата и время, диапазон от '1000-01-01 00:00:00' до '9999-12-31 23:59:59'.
  • TIMESTAMP — дата и время с автоматическим преобразованием в UTC, диапазон от '1970-01-01 00:00:01' UTC до '2038-01-19 03:14:07' UTC.
  • YEAR — год в формате YYYY, диапазон от 1901 до 2155.

2.4. Специальные типы

  • ENUM('value1', 'value2', ...) — строка, принимающая одно из заданных значений.
  • SET('value1', 'value2', ...) — строка, содержащая любую комбинацию заданных значений.
  • JSON — тип для хранения и обработки JSON-документов (начиная с MySQL 5.7).

3. Функции

3.1. Строковые функции

  • CONCAT(str1, str2, ...) — объединение строк.
  • SUBSTRING(str, pos, len) — извлечение подстроки.
  • LENGTH(str) — длина строки в байтах.
  • CHAR_LENGTH(str) — длина строки в символах.
  • UPPER(str), LOWER(str) — преобразование регистра.
  • TRIM([LEADING|TRAILING|BOTH] [remstr] FROM str) — удаление пробелов или указанной строки.
  • REPLACE(str, from_str, to_str) — замена подстроки.
  • REGEXP_REPLACE(str, pattern, replacement) — замена по регулярному выражению.
  • JSON_EXTRACT(json_doc, path) — извлечение значения из JSON.
  • JSON_SET(json_doc, path, val[, path, val]...) — установка значения в JSON.

3.2. Числовые функции

  • ABS(X) — модуль числа.
  • CEIL(X), FLOOR(X) — округление вверх и вниз.
  • ROUND(X, D) — округление до D знаков.
  • RAND([N]) — генерация случайного числа.
  • POWER(X, Y) — возведение в степень.
  • SQRT(X) — квадратный корень.
  • MOD(N, M) — остаток от деления.

3.3. Функции даты и времени

  • NOW() — текущие дата и время.
  • CURDATE(), CURTIME() — текущая дата и время соответственно.
  • DATE_ADD(date, INTERVAL expr unit) — добавление интервала.
  • DATEDIFF(date1, date2) — разница в днях.
  • TIMESTAMPDIFF(unit, datetime1, datetime2) — разница в указанных единицах.
  • UNIX_TIMESTAMP([date]) — преобразование даты в Unix-время.
  • FROM_UNIXTIME(unix_timestamp) — обратное преобразование.

3.4. Агрегатные функции

  • COUNT(expr) — количество строк.
  • SUM(expr) — сумма значений.
  • AVG(expr) — среднее значение.
  • MIN(expr), MAX(expr) — минимальное и максимальное значение.
  • GROUP_CONCAT(expr ORDER BY ... SEPARATOR sep) — конкатенация значений в группе.

3.5. Условные функции

  • IF(condition, true_val, false_val) — условное выражение.
  • CASE WHEN cond1 THEN res1 [WHEN cond2 THEN res2 ...] [ELSE resN] END — многоусловное ветвление.
  • NULLIF(expr1, expr2) — возвращает NULL, если значения равны.
  • COALESCE(val1, val2, ...) — возвращает первый ненулевой аргумент.

3.6. Функции безопасности и информации

  • USER(), CURRENT_USER() — информация о текущем пользователе.
  • DATABASE() — текущая база данных.
  • VERSION() — версия сервера.
  • SESSION_USER(), SYSTEM_USER() — псевдонимы для USER().

4. Системные переменные

Системные переменные делятся на глобальные (влияют на весь сервер) и сессионные (влияют только на текущее соединение). Изменяются через SET GLOBAL или SET SESSION.

4.1. Основные переменные

  • autocommit — автоматическое завершение каждой команды как отдельной транзакции.
  • sql_mode — режим совместимости и строгости SQL (например, STRICT_TRANS_TABLES, NO_ZERO_DATE).
  • default_storage_engine — движок таблиц по умолчанию (обычно InnoDB).
  • character_set_server — кодировка по умолчанию для сервера.
  • collation_server — правило сортировки по умолчанию.
  • max_connections — максимальное число одновременных подключений.
  • wait_timeout — время ожидания неактивного соединения до закрытия.
  • interactive_timeout — аналогично для интерактивных сессий.
  • tmp_table_size, max_heap_table_size — ограничения на размер временных таблиц в памяти.
  • sort_buffer_size — буфер для сортировки в рамках сессии.
  • join_buffer_size — буфер для соединений без индексов.
  • read_buffer_size — буфер для последовательного чтения.
  • read_rnd_buffer_size — буфер для чтения в произвольном порядке.

4.2. Переменные InnoDB

  • innodb_buffer_pool_size — основной кэш данных и индексов (рекомендуется 70–80% ОЗУ).
  • innodb_log_file_size — размер одного файла redo log.
  • innodb_log_files_in_group — количество файлов redo log.
  • innodb_flush_log_at_trx_commit — частота сброса лога на диск (1 — полная безопасность, 2 — компромисс, 0 — максимальная производительность).
  • innodb_file_per_table — каждая таблица хранится в отдельном .ibd файле.
  • innodb_flush_method — метод записи на диск (O_DIRECT, fsync и др.).
  • innodb_io_capacity, innodb_io_capacity_max — ограничение IOPS для фоновых операций.

4.3. Переменные репликации

  • server_id — уникальный идентификатор сервера в репликации.
  • log_bin — включение binary log.
  • binlog_format — формат бинарного лога (STATEMENT, ROW, MIXED).
  • gtid_mode — включение глобальных идентификаторов транзакций.
  • enforce_gtid_consistency — требование совместимости запросов с GTID.
  • relay_log — путь к relay-логам на реплике.
  • read_only — запрет модификации данных на реплике.

5. Конфигурационные параметры (my.cnf / my.ini)

Файл конфигурации MySQL (my.cnf в Linux/macOS, my.ini в Windows) читается при запуске сервера. Он может содержать секции: [mysqld], [mysql], [mysqldump], [client] и другие.

5.1. Основные параметры в секции [mysqld]

Сетевые настройки

  • port = 3306 — порт прослушивания.
  • bind-address = 0.0.0.0 — IP-адрес, на котором слушает сервер. 0.0.0.0 разрешает подключения с любого адреса.
  • socket = /var/run/mysqld/mysqld.sock — путь к Unix-сокету (Linux/macOS).
  • skip-networking — отключает TCP/IP-подключения, разрешая только локальные через сокет.

Безопасность

  • secure-file-priv = /var/lib/mysql-files/ — ограничивает каталог для операций LOAD DATA INFILE и SELECT ... INTO OUTFILE.
  • local-infile = 0 — отключает клиентскую загрузку файлов из локальной машины.
  • require_secure_transport = ON — требует использование SSL/TLS для всех подключений.
  • default_authentication_plugin = caching_sha2_password — плагин аутентификации по умолчанию (начиная с MySQL 8.0).

Память и буферы

  • key_buffer_size — размер буфера для индексов MyISAM.
  • innodb_buffer_pool_size — основной кэш InnoDB (рекомендуется 70–80% доступной RAM).
  • tmp_table_size, max_heap_table_size — максимальный размер временных таблиц в памяти.
  • table_open_cache — количество открытых дескрипторов таблиц.
  • thread_cache_size — кэш потоков для повторного использования.

Журналирование

  • log-error = /var/log/mysql/error.log — путь к логу ошибок.
  • general_log = 1 — включает общий лог запросов.
  • general_log_file = /var/log/mysql/general.log
  • slow_query_log = 1 — включает лог медленных запросов.
  • slow_query_log_file = /var/log/mysql/slow.log
  • long_query_time = 2 — порог времени (в секундах) для попадания в slow log.
  • log_queries_not_using_indexes = 1 — записывает в slow log запросы без использования индексов.

Binary Log и репликация

  • server-id = 1 — уникальный ID сервера (обязателен при репликации).
  • log_bin = /var/log/mysql/mysql-bin.log — включает binary log.
  • binlog_format = ROW — формат бинарного лога (STATEMENT, ROW, MIXED).
  • expire_logs_days = 7 — автоматическое удаление старых binlog-файлов.
  • max_binlog_size = 100M — максимальный размер одного файла binlog.

InnoDB

  • innodb_data_home_dir = /var/lib/mysql/
  • innodb_data_file_path = ibdata1:12M:autoextend
  • innodb_log_group_home_dir = /var/lib/mysql/
  • innodb_log_file_size = 48M
  • innodb_log_files_in_group = 2
  • innodb_flush_log_at_trx_commit = 1
  • innodb_file_per_table = 1
  • innodb_flush_method = O_DIRECT
  • innodb_io_capacity = 200
  • innodb_io_capacity_max = 2000

Характеристики поведения

  • sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION — строгий режим SQL.
  • character-set-server = utf8mb4
  • collation-server = utf8mb4_unicode_ci
  • default-storage-engine = InnoDB
  • explicit_defaults_for_timestamp = 1 — изменяет поведение TIMESTAMP-полей.

6. SQL-операторы

6.1. DDL (Data Definition Language)

  • CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset] [COLLATE collation];
  • DROP DATABASE [IF EXISTS] db_name;
  • CREATE TABLE tbl_name (col_def, ..., [ENGINE=engine]);
  • ALTER TABLE tbl_name ADD COLUMN col_def;
  • DROP TABLE [IF EXISTS] tbl_name;
  • TRUNCATE TABLE tbl_name; — полная очистка таблицы с сбросом автоинкремента.
  • RENAME TABLE old_name TO new_name;

6.2. DML (Data Manipulation Language)

  • INSERT INTO tbl (col1, col2) VALUES (val1, val2);
  • UPDATE tbl SET col = val WHERE condition;
  • DELETE FROM tbl WHERE condition;
  • SELECT col1, col2 FROM tbl WHERE condition GROUP BY col HAVING filter ORDER BY col LIMIT n;

6.3. TCL (Transaction Control Language)

  • START TRANSACTION;
  • COMMIT;
  • ROLLBACK;
  • SAVEPOINT sp_name;
  • ROLLBACK TO SAVEPOINT sp_name;

6.4. DCL (Data Control Language)

  • CREATE USER 'user'@'host' IDENTIFIED BY 'password';
  • DROP USER 'user'@'host';
  • GRANT priv_type ON db.tbl TO 'user'@'host';
  • REVOKE priv_type ON db.tbl FROM 'user'@'host';
  • FLUSH PRIVILEGES; — перезагрузка привилегий из таблицы.

6.5. Административные команды

  • SHOW DATABASES;
  • SHOW TABLES;
  • SHOW COLUMNS FROM tbl;
  • SHOW CREATE TABLE tbl;
  • SHOW PROCESSLIST;
  • KILL connection_id;
  • SET GLOBAL variable_name = value;
  • RESET MASTER; — очистка binary log.
  • PURGE BINARY LOGS BEFORE 'datetime';

7. Права и безопасность

7.1. Уровни привилегий

  • Глобальный (*.*) — влияет на все базы и таблицы.
  • Базы данных (db.*) — влияет на все объекты в указанной БД.
  • Таблицы (db.tbl) — влияет на конкретную таблицу.
  • Столбцы (db.tbl (col1, col2)) — влияет на указанные столбцы.

7.2. Основные привилегии

  • ALL PRIVILEGES — полный доступ.
  • SELECT, INSERT, UPDATE, DELETE — манипуляции с данными.
  • CREATE, DROP, ALTER — управление структурой.
  • INDEX — создание и удаление индексов.
  • REFERENCES — внешние ключи.
  • EXECUTE — выполнение хранимых процедур.
  • USAGE — «нулевая» привилегия (часто используется для установки лимитов).

7.3. Роли (MySQL 8.0+)

  • CREATE ROLE 'app_reader', 'app_writer';
  • GRANT SELECT ON app_db.* TO 'app_reader';
  • GRANT INSERT, UPDATE ON app_db.* TO 'app_writer';
  • GRANT 'app_reader' TO 'user'@'host';
  • SET DEFAULT ROLE ALL TO 'user'@'host';

7.4. Аудит и логирование действий

  • Встроенного аудита нет в Community Edition. Используется Enterprise Audit Plugin или сторонние решения.
  • Все действия можно частично отследить через general log и binary log.

8. Администрирование

8.1. Управление пользователями

  • Создание:
    CREATE USER 'dev'@'%' IDENTIFIED BY 'strong_password';
  • Удаление:
    DROP USER 'dev'@'%';
  • Смена пароля:
    ALTER USER 'dev'@'%' IDENTIFIED BY 'new_password';
  • Блокировка/разблокировка:
    ALTER USER 'dev'@'%' ACCOUNT LOCK;
    ALTER USER 'dev'@'%' ACCOUNT UNLOCK;

8.2. Резервное копирование и восстановление

  • Логическое резервное копирование:
    mysqldump --single-transaction --routines --triggers --events db_name > backup.sql
  • Восстановление:
    mysql db_name < backup.sql
  • Физическое резервное копирование (InnoDB):
    Используется mysqlbackup (Enterprise) или Percona XtraBackup (Community).
  • Точка во времени (PITR):
    Комбинирует полный дамп и применение binary log с помощью mysqlbinlog.

8.3. Мониторинг

  • Информация о состоянии:
    SHOW STATUS LIKE 'Threads_connected';
    SHOW GLOBAL STATUS;
  • Информация о переменных:
    SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
  • Активные соединения:
    SHOW PROCESSLIST;
  • Блокировки InnoDB:
    SELECT * FROM performance_schema.data_locks;
    SELECT * FROM performance_schema.data_lock_waits;

8.4. Обслуживание таблиц

  • Анализ:
    ANALYZE TABLE tbl_name;
  • Оптимизация:
    OPTIMIZE TABLE tbl_name;  -- для InnoDB перестраивает таблицу
  • Проверка целостности:
    CHECK TABLE tbl_name;
  • Восстановление:
    REPAIR TABLE tbl_name;  -- только для MyISAM

9. Производительность

9.1. Индексы

  • B-Tree — стандартный тип для большинства столбцов.
  • Full-Text — для полнотекстового поиска (MATCH ... AGAINST).
  • Spatial — для геоданных (MyISAM, InnoDB начиная с 5.7).
  • Prefix Index — индекс по первым N символам:
    CREATE INDEX idx ON tbl (col(20));
  • Composite Index — составной индекс по нескольким столбцам.
  • Covering Index — индекс, содержащий все запрашиваемые столбцы.

9.2. EXPLAIN и анализ плана выполнения

  • EXPLAIN SELECT ... — показывает план запроса.
  • Ключевые поля:
    • type: const, eq_ref, ref, range, index, ALL.
    • key: используемый индекс.
    • rows: оценка числа просматриваемых строк.
    • Extra: дополнительная информация (Using index, Using filesort, Using temporary).

9.3. Performance Schema

  • Включается через performance_schema = ON в конфигурации.
  • Предоставляет данные о:
    • Ожиданиях (waits)
    • SQL-запросах (events_statements_history)
    • Блокировках
    • Использовании индексов
  • Пример:
    SELECT * FROM performance_schema.events_statements_summary_by_digest
    ORDER BY avg_timer_wait DESC LIMIT 10;

9.4. Query Cache (устарело)

  • Удалён в MySQL 8.0. Не используется.

10. Репликация

10.1. Типы репликации

  • Асинхронная — мастер не ждёт подтверждения от реплик.
  • Полусинхронная — требует подтверждения хотя бы от одной реплики.
  • Групповая (Group Replication) — основано на протоколе Paxos, обеспечивает согласованность.

10.2. Настройка основной репликации

На мастере:

server-id = 1
log_bin = mysql-bin
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = ON

Создание пользователя:

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

На реплике:

server-id = 2
relay_log = mysql-relay-bin
read_only = ON
gtid_mode = ON
enforce_gtid_consistency = ON

Запуск репликации:

CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_AUTO_POSITION=1;
START SLAVE;

10.3. Мониторинг репликации

  • SHOW SLAVE STATUS\G — ключевые поля: Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master.
  • Ошибки: проверяются в Last_IO_Error, Last_SQL_Error.

10.4. Multi-Source Replication

Одна реплика может получать данные от нескольких мастеров (начиная с MySQL 5.7).


11. JSON

11.1. Хранение

  • Столбец типа JSON автоматически проверяет валидность документа.
  • Хранится в бинарном формате для быстрого доступа.

11.2. Основные функции

  • JSON_EXTRACT(col, '$.key') или col->'$.key'
  • JSON_SET(col, '$.key', 'value')
  • JSON_INSERT, JSON_REPLACE, JSON_REMOVE
  • JSON_CONTAINS(col, '{"key": "value"}')
  • JSON_KEYS(col)
  • JSON_LENGTH(col)

11.3. Индексирование JSON

  • Генерируемые виртуальные столбцы:
    ALTER TABLE t ADD COLUMN name VARCHAR(30) AS (json_col->>'$.name');
    CREATE INDEX idx_name ON t (name);

12. Оконные функции (MySQL 8.0+)

Оконные функции позволяют выполнять вычисления по группам строк без свёртки.

12.1. Синтаксис

function_name() OVER (
[PARTITION BY expr, ...]
[ORDER BY expr [ASC|DESC], ...]
[frame_clause]
)

12.2. Основные функции

  • ROW_NUMBER() — нумерация строк.
  • RANK(), DENSE_RANK() — ранжирование с пропусками или без.
  • LEAD(expr, offset), LAG(expr, offset) — доступ к следующей/предыдущей строке.
  • FIRST_VALUE(expr), LAST_VALUE(expr) — первое и последнее значение в окне.
  • NTILE(n) — деление на n групп.
  • Агрегатные функции: SUM(), AVG(), MIN(), MAX() — могут использоваться как оконные.

12.3. Пример

SELECT 
name,
salary,
AVG(salary) OVER (PARTITION BY dept) AS avg_dept_salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;

13. Обратная совместимость

13.1. Изменения в MySQL 8.0

  • Удалён Query Cache.
  • По умолчанию используется utf8mb4 и utf8mb4_0900_ai_ci.
  • Аутентификация по умолчанию — caching_sha2_password.
  • Словарь данных перенесён в InnoDB.
  • Групповые привилегии заменены ролями.
  • Поддержка общих табличных выражений (CTE):
    WITH recursive_cte AS (...)
    SELECT * FROM recursive_cte;

13.2. Миграция с MySQL 5.7

  • Проверить совместимость запросов с sql_mode.
  • Обновить клиентские драйверы для поддержки нового метода аутентификации.
  • Выполнить mysql_upgrade после обновления (в MySQL 8.0 эта команда устарела; обновление происходит автоматически при запуске).

14. Полезные команды и практики

14.1. Быстрый экспорт таблицы в CSV

SELECT * FROM tbl
INTO OUTFILE '/tmp/tbl.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

(Требует разрешения secure-file-priv.)

14.2. Поиск «тяжёлых» запросов

SELECT 
query,
exec_count,
avg_timer_wait / 1000000000 AS avg_sec
FROM performance_schema.events_statements_summary_by_digest
WHERE schema_name = 'your_db'
ORDER BY avg_timer_wait DESC
LIMIT 10;

14.3. Восстановление пароля root

  1. Остановить MySQL.
  2. Запустить с --skip-grant-tables.
  3. Подключиться без пароля.
  4. Выполнить:
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
  5. Перезапустить сервер в обычном режиме.

14.4. Проверка использования индексов

SELECT 
table_schema,
table_name,
index_name,
seq_in_index,
column_name
FROM information_schema.statistics
WHERE table_schema NOT IN ('mysql', 'information_schema', 'performance_schema')
ORDER BY table_schema, table_name, index_name, seq_in_index;

15. Распространённые ошибки и решения

ОшибкаПричинаРешение
ERROR 1045 (28000): Access deniedНеверное имя пользователя, хост или парольПроверить user и host в mysql.user; использовать ALTER USER
ERROR 1205 (HY000): Lock wait timeout exceededДолгая транзакция блокирует другиеУвеличить innodb_lock_wait_timeout; найти и завершить блокирующую транзакцию
ERROR 1114 (HY000): The table is fullДостигнут лимит tmp_table_size или дискаУвеличить tmp_table_size; оптимизировать запрос
ERROR 1062 (23000): Duplicate entryНарушение уникальностиПроверить данные или использовать INSERT IGNORE / ON DUPLICATE KEY UPDATE
ERROR 2002 (HY000): Can't connect to local MySQL serverСервер не запущен или сокет недоступенПроверить статус службы; указать правильный socket

16. Рекомендации по настройке сервера

16.1. Для разработки

  • innodb_buffer_pool_size = 128M
  • max_connections = 50
  • general_log = 1 (временно)
  • sql_mode = "" (для гибкости, но не в продакшене)

16.2. Для продакшена

  • innodb_buffer_pool_size = 70–80% RAM
  • innodb_log_file_size = 1–2 ГБ
  • innodb_flush_log_at_trx_commit = 1
  • binlog_format = ROW
  • gtid_mode = ON
  • sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION
  • character_set_server = utf8mb4
  • collation_server = utf8mb4_unicode_ci
  • slow_query_log = 1
  • long_query_time = 1

16.3. Безопасность

  • Отключить local-infile.
  • Использовать secure-file-priv.
  • Ограничить пользователей по хосту ('user'@'app-server').
  • Регулярно обновлять MySQL.
  • Не использовать учётную запись root для приложений.